package main

import (
	"bufio"
	"io"

	// "bufio"
	"fmt"
	"os"
	// "io"
	"io/ioutil"
	// "os"
)

// 读文件有三种操作方法： file.read、bufio、ioutio
// func main() {
// 	fileObj,err:=os.Open("./common.go")
// 	if err != nil {
// 		fmt.Printf("open file failed,err:%v", err)
// 		return
// 	}
// 	// 记得关闭文件
// 	defer fileObj.Close()
// 	// 采用for循环读文件 （自己设定读多少字节）
// 	var tmp =make([]byte,128) //指定读的长度
// 	for{
// 		n,err:=fileObj.Read(tmp[:])
// 		if err ==io.EOF {
// 			fmt.Println("文件读完了")
// 			return
// 		}
// 		if err != nil {
// 			fmt.Printf("read error: %v\n", err)
// 			return
// 		}
// 		fmt.Printf("读了%d个字节\n",n)
// 		fmt.Println(string(tmp[:n]))
// 		if n<128 {
// 			return
// 		}
// 	}
// }
// 利用bufio这个包读取文件(一行一行的读)
func readFromFilebyBufio() {
	fileObj, err := os.Open("./common.go")
	if err != nil {
		fmt.Printf("Error opening file: %v\n", err)
		return
	}
	// 记得关闭文件
	defer fileObj.Close()
	// 创建一个用来存文件中读内容的对象
	reader := bufio.NewReader(fileObj)
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			return
		}
		if err != nil {
			fmt.Printf("read file failed,err:%v ", err)
			return
		}
		fmt.Println(line)
	}
}

// func main(){
// 	readFromFilebyBufio()
// }
// 采用Ioutil读取整个文件
func readFromFilebyIoutil() {
	ret, err := ioutil.ReadFile("./common.go")
	if err != nil {
		fmt.Printf("read file failed,err:%v", err)
		return
	}
	fmt.Println(string(ret))
}
func main() {
	// read from file
	readFromFilebyIoutil()
	readFromFilebyBufio()
	/*
		FileInfo 文件信息
			os.Stat(string)文件信息
				Name()文件名
				Size()文件大小
				IsDir()是否为目录
				Mode()文件权限
	*/
	//if fileInfo, err := os.Stat("./1.txt"); err != nil {
	//	fmt.Println("err", err)
	//	return
	//} else {
	//	fmt.Printf("%T\n", fileInfo)
	//}
	//Fileinfo, err := os.Stat("./1.txt")
	//if err != nil {
	//	fmt.Println("err", err)
	//	return
	//}
	//fmt.Println(Fileinfo.Name())  //得到文件名
	//fmt.Println(Fileinfo.Size())  //得到文件大小
	//fmt.Println(Fileinfo.IsDir()) //判断是否是目录
	//fmt.Println(Fileinfo.Mode())  //得到文件权限-->采用rwx表示

	/*
		文件操作
			1.文件路径
				相对路径: relative
				绝对路径: absolute
					IsAbs()判断是否为绝对路径,bool值
					Abs()打印绝对路径
				. 当前目录  ..上一级
			2.创建目录
				os.Mkdir() 创建单层目录
				os.MkdirAll() 创建多层目录
			3.创建文件
				os.Create()创建文件对象
			4.打开文件
				os.Open()打开文件-->只读
				os.OpenFile()打开文件 -->可自行设置需求(读\写)
			5.关闭文件
				文件名.Close()
			6.删除文件
				os.Remove()
	*/
	// 1.打印文件路径
	//filename1 := "/usr/1.txt"
	//filename2 := "D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\1.txt"
	//fmt.Println(filepath.IsAbs(filename1))
	//fmt.Println(filepath.IsAbs(filename2))
	//fmt.Println(filepath.Abs(filename1))
	//fmt.Println(filepath.Abs(filename2))
	//fmt.Println("获取父目录", path.Join(filename1, "..")) //打印1.txt的上一级目录
	////2.创建单个目录
	////if err := os.Mkdir("D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\test", os.ModePerm); err != nil {
	////	fmt.Println("创建目录失败", err)
	////	return
	////}
	////fmt.Println("目录创建成功")
	////2.创建多层目录MkdirAll()
	//if err := os.MkdirAll("D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\test\\test\\test", os.ModePerm); err != nil {
	//	fmt.Println("多层创建目录失败", err)
	//	return
	//}
	//fmt.Println("目录创建成功")
	////	3.创建文件 create采用模式0666,如果文件已存在,则会截断它(空文件)
	//file, err := os.Create("D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\2.txt")
	//if err != nil {
	//	fmt.Println("多层创建目录失败", err)
	//	return
	//}
	//fmt.Println("文件创建成功", file)
	////	4.打开文件(open只是只读,如果要想写采用openFile)
	////file1, err := os.Open("./1.txt")
	////if err != nil {
	////	fmt.Println("打开文件失败", err)
	////	return
	////}
	////fmt.Println("文件打开成功", file1)
	//if file2, err := os.OpenFile("./2.txt", os.O_RDWR, os.ModePerm); err != nil {
	//	fmt.Println("打开失败")
	//	return
	//} else {
	//	fmt.Println("文件打开成功", file2)
	//}
	////	6.删除文件或空目录(目录必须为空才能删除该目录,否则会报错;如果不为空删除,则需要使用RemoveAll来进行删除)
	//if err := os.Remove("./1.txt"); err != nil {
	//	fmt.Println("删除文件失败", err)
	//	return
	//} else {
	//	fmt.Println("删除文件成功")
	//}

}
